Imports Common
Imports Microsoft.VisualBasic.CompilerServices
Imports StartFrame.BR
Imports StartFrame.DA
Imports StartFrame.Web.BR.Helpers
Imports System
Imports System.Data.SqlClient
Imports System.Web.Security

Public Class Login
    Public Function Login(Action As String, Usuario As String, Password As String, Optional newPassword As String = Nothing, Optional newRepeatPassword As String = Nothing) As String
        Select Case Action
            Case "ingresar" 'Valida el ingreso (logueo) al sistema
                Try
                    Common.Env.Operador = Nothing
                    Common.Env.GrupoOperador = Nothing
                    If EsUnOperadorValido(Usuario, Password) Then
                        Return "{success: true}"
                    Else
                        Return "{success: false, message: 'El usuario o la contraseña son invalidos.' }"
                    End If

                Catch sEx As System.Data.SqlClient.SqlException 'Errores de base de datos
                    Select Case sEx.ErrorCode
                        Case 10054
                            Return String.Format("{{ success: false, message: '{0}' }}", "El servidor SQL rechazó la conexión")
                        Case 52
                            Return String.Format("{{ success: false, message: '{0}' }}", "El servidor SQL no fue encontrado")
                    End Select
                    Return New ResultSet() With {.success = False, .message = sEx.Message}.ToJsonString()
                Catch mex As MembershipPasswordException    'Errores de seguridad
                    If mex.Message.Equals("ChangePassword") Then
                        If Not String.IsNullOrEmpty(newPassword) AndAlso Not String.IsNullOrEmpty(newRepeatPassword) Then
                            If newPassword.Equals(newRepeatPassword) Then
                                Dim sca As New Sca
                                sca.CambiarClaveAcceso(Usuario, Password, newPassword)
                                Return "{success: true}"
                            End If
                        End If
                        Return String.Format("{{ success: false, changePassword: true, message: '{0}' }}", "El usuario debe cambiar la clave")
                    End If
                    Throw New Exception(mex.Message)
                Catch ex As Exception   'Errores genéricos
                    Return New ResultSet() With {.success = False, .message = ex.GetBaseException().Message.Replace("[ValidaOperador]", "")}.ToJsonString()
                End Try

            Case "salir"    'Registra la salida de un usuario de la aplicación (logout)
                Try
                    Dim sca As New Sca
                    sca.Logout(Common.Env.Operador)
                    Common.Env.Operador = Nothing
                    Common.Env.GrupoOperador = Nothing
                    Return "{success: true}"
                Catch ex As Exception
                    Return New ResultSet() With {.success = False, .message = ex.Message}.ToJsonString()
                End Try
        End Select
        Return "{success: false}"
    End Function

    'Verifica si existe el operador dentro del sistema
    Private Function EsUnOperadorValido(ByVal nombreOperador As String, ByVal claveAcceso As String) As Boolean
        Dim sca As New Sca
        Try
            If sca.ExisteOperador(nombreOperador) Then
                'Registra la terminal si no existe
                sca.SetPrefTerm(Common.Env.Terminal, nombreOperador, 1, "", 0, 0, 0)

                If Common.Env.GetConfigValue("useIdentity") = True Then
                    claveAcceso = DA.Sql.Search(Common.Env.ConnectionString, String.Format("SELECT va_clave_acceso FROM wad_operadores WHERE cd_operador = '{0}'", nombreOperador))
                    claveAcceso = SystemFunctions.Strings.EncryptString(claveAcceso, Common.Env.KEY, SystemFunctions.Strings.Accion.DECRYPT)
                End If

                'Verifica si es un usuario válido
                If sca.Login(nombreOperador, claveAcceso) Then
                    'Verifica si debe cambiar su clave de acceso
                    If sca.RequiereCambioClave(nombreOperador) Then
                        Throw New MembershipPasswordException("ChangePassword")
                    End If
                    'Propiedades de la Common
                    Common.Env.Operador = nombreOperador
                    Common.Env.Password = claveAcceso
                    'Fin ok
                    Return True
                End If
            End If

            'Fin mal
            Return False

        Catch ex As Exception
            Throw ex
        Finally
            sca = Nothing
        End Try
    End Function
End Class
